import { Message, Modal } from '@arco-design/web-vue';
import aes from './aesUtils';
import debug from '@/utils/env';
import { checkPermissions } from '@/config/permissions';
import router from '@/router/router';
let App: { config: { globalProperties: any } } | null = null;

const utils = {
	/**
	 * 权限检查
	 * @param permission
	 * @returns
	 */
	has(permission: string) {
		return checkPermissions(permission);
	},
	/**
	 * 是否开发环境
	 * @returns boolean
	 */
	isDev() {
		return debug;
	},
	/**
	 * 页面跳转
	 * @param url
	 * @param param
	 * @returns
	 */
	doUrl(url: any, param?: any) {
		let app = App?.config.globalProperties;
		let path = '/' + url;
		let uri = path.replace('//', '/');
		if (uri == app.$route.path) {
			return;
		}
		router.push({ path: uri, query: param });
	},
	/**
	 * 手机号脱敏
	 * @param {*} str
	 * @param {*} isDecrypt
	 * @returns
	 */
	noPassByMobile(str: any, isDecrypt: boolean) {
		if (isDecrypt == true) {
			str = aes.decrypt(str, null);
		}
		if (null != str && str != undefined) {
			var pat = /(\d{3})\d*(\d{4})/;
			return str.replace(pat, '$1****$2');
		} else {
			return '';
		}
	},
	/**
	 * 身份证脱敏
	 */
	noPassByIdCard(str: any) {
		if (str.length < 18) {
			return str;
		}
		return str.replace(/^(.{6})(?:\d+)(.{4})$/, '$1****$2');
	},
	/**
	 * 姓名脱敏
	 * @param {string} str
	 * @returns
	 */
	noPassByName(str: any) {
		if (null != str && str != undefined) {
			if (str.length <= 3) {
				return '*' + str.substring(1, str.length);
			} else if (str.length > 3 && str.length <= 6) {
				return '**' + str.substring(2, str.length);
			} else if (str.length > 6) {
				return str.substring(0, 2) + '****' + str.substring(6, str.length);
			}
		} else {
			return '';
		}
	},
	/**
	 * 空判断
	 * @param {Object} obj
	 */
	isEmpty(obj: any) {
		if (obj == null || obj == undefined || obj == '' || obj == 'undefined') {
			return true;
		}
		if (typeof obj == 'string' && obj.length == 0) {
			return true;
		}
		if (typeof obj == 'object' && Object.keys(obj).length == 0) {
			return true;
		}
		return false;
	},
	// 预览图片
	openImage(img: string) {
		if (App) {
			let app = App.config.globalProperties;
			app.mittBus.emit('open-image', img);
		}
	},
	//字符串转数字
	stringToInt(val: any) {
		let value = parseInt(val);
		return isNaN(val) ? '' : value;
	},
	//判断后缀名
	getSuffix(name: string) {
		let dotPos = name.lastIndexOf('.');
		if (dotPos < 0) {
			return null;
		}
		return name.substring(dotPos + 1).toLowerCase();
	},
	//加载框
	loading(time?: any, callback?: any) {
		Message.loading({
			content: '加载中,请稍后....',
			duration: time ? time : 60000,
			onClose: callback ? callback : null
		});
	},
	//确认框
	confirm(message: string) {
		return new Promise((resolve, reject) => {
			Modal.confirm({
				title: '操作提示',
				content: message,
				closable: true,
				onOk: () => {
					resolve(true);
				}
			});
		});
	},
	//消息提示
	info(msg: string) {
		Message.info(msg);
	},
	//警告
	warning(msg: string) {
		Message.warning(msg);
	},
	//错误提示
	error(msg: string, duration?: number) {
		return new Promise((resolve, reject) => {
			Message.error({
				content: msg,
				duration: duration ? duration : 2000,
				onClose: res => {
					resolve(res);
				}
			});
		});
	},
	//成功提示
	success(msg: string, duration?: number) {
		return new Promise((resolve, reject) => {
			Message.success({
				content: msg,
				duration: duration ? duration : 2000,
				onClose: res => {
					resolve(res);
				}
			});
		});
	},
	//关闭消息提示和加载框
	closeAll() {
		Message.clear();
	},
	/**
	 * 开启全屏加载
	 */
	showSpin(msg?: any) {
		if (App) {
			let app = App.config.globalProperties;
			app.mittBus.emit('show-loading', msg);
		}
	},
	//关闭全屏加载效果
	closeSpin() {
		if (App) {
			let app = App.config.globalProperties;
			app.mittBus.emit('hide-loading');
		}
	},

	/**
	 * 生成随机字符串
	 * @param len
	 * @returns {string}
	 */
	getRandStr(len: number) {
		len = len || 32;
		var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz';
		/****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
		var maxPos = $chars.length;
		var pwd = '';
		for (var i = 0; i < len; i++) {
			pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
		}
		return pwd;
	},
	/**
	 * 生成随机数
	 * @param {*} minNum
	 * @param {*} maxNum
	 * @returns
	 */
	getRandNum(minNum: any, maxNum: any) {
		switch (arguments.length) {
			case 1:
				return parseInt((Math.random() * minNum + 1).toString(), 10);
				break;
			case 2:
				return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
				break;
			default:
				return 0;
				break;
		}
	},
	/**
	 * Url转对象
	 * @param url
	 * @returns {Object}
	 */
	urlToarray(url: any) {
		var strlen = url.indexOf('?');
		if (strlen != -1) {
			var urlstr = url.substr(strlen + 1);
		} else {
			var urlstr = url.substr(1);
		}
		//拆分key value
		var arr = urlstr.split('&');
		var obj = new Object();
		for (var i = 0; i < arr.length; i++) {
			var item = arr[i].split('=');
			obj[item[0]] = item[1];
		}
		return obj;
	},
	/**
	 * 日期格式化
	 * @param time
	 * @param fmt
	 * @returns {*}
	 */
	formatDate(time: any, fmt: string) {
		var o = {
			'M+': time.getMonth() + 1, //月份
			'd+': time.getDate(), //日
			'h+': time.getHours(), //小时
			'm+': time.getMinutes(), //分
			's+': time.getSeconds(), //秒
			'q+': Math.floor((time.getMonth() + 3) / 3), //季度
			S: time.getMilliseconds() //毫秒
		};
		if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (time.getFullYear() + '').substr(4 - RegExp.$1.length));
		for (var k in o) if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
		return fmt;
	},
	/**
	 * 获取当前星期
	 * @param nowdate
	 * @returns {*}
	 */
	getWeek(nowdate?: any) {
		var date = nowdate ? nowdate : new Date();
		var weekday = ['周 日', '周 一', '周 二', '周 三', '周 四', '周 五', '周 六'];
		return weekday[date.getDay()];
	},
	/**
	 * 手机号效验
	 * @param mobile
	 * @returns {boolean}
	 */
	checkMobile(mobile: any) {
		if (mobile == '' || mobile == undefined) {
			return false;
		}
		if (mobile.length != 11) {
			return false;
		}
		if (!/^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\d{8}$/.test(mobile)) {
			return false;
		} else {
			return true;
		}
	},
	/**
	 * 身份证号码验证
	 * @param card
	 * @returns {boolean}
	 */
	isCardNo(card: any) {
		// 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X
		if (card == '' || card == undefined) {
			return false;
		}
		if (card.length > 18) {
			return false;
		}
		if (!/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(card)) {
			return false;
		} else {
			return true;
		}
	},
	//身份证加星号
	judgeCard(val: any) {
		if (!val) return '';
		return val.replace(/^(.{4}).+(.{4})$/, '$1****$2');
	},
	/**
	 * MD5加密
	 * @param string
	 * @returns {string}
	 */
	md5(string: any) {
		var rotateLeft = function (lValue: any, iShiftBits: any) {
			return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
		};
		var addUnsigned = function (lX: any, lY: any) {
			var lX4, lY4, lX8, lY8, lResult;
			lX8 = lX & 0x80000000;
			lY8 = lY & 0x80000000;
			lX4 = lX & 0x40000000;
			lY4 = lY & 0x40000000;
			lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff);
			if (lX4 & lY4) return lResult ^ 0x80000000 ^ lX8 ^ lY8;
			if (lX4 | lY4) {
				if (lResult & 0x40000000) return lResult ^ 0xc0000000 ^ lX8 ^ lY8;
				else return lResult ^ 0x40000000 ^ lX8 ^ lY8;
			} else {
				return lResult ^ lX8 ^ lY8;
			}
		};
		var F = function (x: any, y: any, z: any) {
			return (x & y) | (~x & z);
		};
		var G = function (x: any, y: any, z: any) {
			return (x & z) | (y & ~z);
		};
		var H = function (x: any, y: any, z: any) {
			return x ^ y ^ z;
		};
		var I = function (x: any, y: any, z: any) {
			return y ^ (x | ~z);
		};
		var FF = function (a: any, b: any, c: any, d: any, x: any, s: any, ac: any) {
			a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
		var GG = function (a: any, b: any, c: any, d: any, x: any, s: any, ac: any) {
			a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
		var HH = function (a: any, b: any, c: any, d: any, x: any, s: any, ac: any) {
			a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
		var II = function (a: any, b: any, c: any, d: any, x: any, s: any, ac: any) {
			a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
		var convertToWordArray = function (string: any) {
			var lWordCount;
			var lMessageLength = string.length;
			var lNumberOfWordsTempOne = lMessageLength + 8;
			var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64;
			var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16;
			var lWordArray = Array(lNumberOfWords - 1);
			var lBytePosition = 0;
			var lByteCount = 0;
			while (lByteCount < lMessageLength) {
				lWordCount = (lByteCount - (lByteCount % 4)) / 4;
				lBytePosition = (lByteCount % 4) * 8;
				lWordArray[lWordCount] = lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition);
				lByteCount++;
			}
			lWordCount = (lByteCount - (lByteCount % 4)) / 4;
			lBytePosition = (lByteCount % 4) * 8;
			lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
			lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
			lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
			return lWordArray;
		};
		var wordToHex = function (lValue: any) {
			var WordToHexValue = '',
				WordToHexValueTemp = '',
				lByte,
				lCount;
			for (lCount = 0; lCount <= 3; lCount++) {
				lByte = (lValue >>> (lCount * 8)) & 255;
				WordToHexValueTemp = '0' + lByte.toString(16);
				WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2);
			}
			return WordToHexValue;
		};
		var uTF8Encode = function (string: any) {
			string = string.replace(/\x0d\x0a/g, '\x0a');
			var output = '';
			for (var n = 0; n < string.length; n++) {
				var c = string.charCodeAt(n);
				if (c < 128) {
					output += String.fromCharCode(c);
				} else if (c > 127 && c < 2048) {
					output += String.fromCharCode((c >> 6) | 192);
					output += String.fromCharCode((c & 63) | 128);
				} else {
					output += String.fromCharCode((c >> 12) | 224);
					output += String.fromCharCode(((c >> 6) & 63) | 128);
					output += String.fromCharCode((c & 63) | 128);
				}
			}
			return output;
		};

		var x = Array();
		var k, AA, BB, CC, DD, a, b, c, d;
		var S11 = 7,
			S12 = 12,
			S13 = 17,
			S14 = 22;
		var S21 = 5,
			S22 = 9,
			S23 = 14,
			S24 = 20;
		var S31 = 4,
			S32 = 11,
			S33 = 16,
			S34 = 23;
		var S41 = 6,
			S42 = 10,
			S43 = 15,
			S44 = 21;
		string = uTF8Encode(string);
		x = convertToWordArray(string);
		a = 0x67452301;
		b = 0xefcdab89;
		c = 0x98badcfe;
		d = 0x10325476;
		for (k = 0; k < x.length; k += 16) {
			AA = a;
			BB = b;
			CC = c;
			DD = d;
			a = FF(a, b, c, d, x[k + 0], S11, 0xd76aa478);
			d = FF(d, a, b, c, x[k + 1], S12, 0xe8c7b756);
			c = FF(c, d, a, b, x[k + 2], S13, 0x242070db);
			b = FF(b, c, d, a, x[k + 3], S14, 0xc1bdceee);
			a = FF(a, b, c, d, x[k + 4], S11, 0xf57c0faf);
			d = FF(d, a, b, c, x[k + 5], S12, 0x4787c62a);
			c = FF(c, d, a, b, x[k + 6], S13, 0xa8304613);
			b = FF(b, c, d, a, x[k + 7], S14, 0xfd469501);
			a = FF(a, b, c, d, x[k + 8], S11, 0x698098d8);
			d = FF(d, a, b, c, x[k + 9], S12, 0x8b44f7af);
			c = FF(c, d, a, b, x[k + 10], S13, 0xffff5bb1);
			b = FF(b, c, d, a, x[k + 11], S14, 0x895cd7be);
			a = FF(a, b, c, d, x[k + 12], S11, 0x6b901122);
			d = FF(d, a, b, c, x[k + 13], S12, 0xfd987193);
			c = FF(c, d, a, b, x[k + 14], S13, 0xa679438e);
			b = FF(b, c, d, a, x[k + 15], S14, 0x49b40821);
			a = GG(a, b, c, d, x[k + 1], S21, 0xf61e2562);
			d = GG(d, a, b, c, x[k + 6], S22, 0xc040b340);
			c = GG(c, d, a, b, x[k + 11], S23, 0x265e5a51);
			b = GG(b, c, d, a, x[k + 0], S24, 0xe9b6c7aa);
			a = GG(a, b, c, d, x[k + 5], S21, 0xd62f105d);
			d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
			c = GG(c, d, a, b, x[k + 15], S23, 0xd8a1e681);
			b = GG(b, c, d, a, x[k + 4], S24, 0xe7d3fbc8);
			a = GG(a, b, c, d, x[k + 9], S21, 0x21e1cde6);
			d = GG(d, a, b, c, x[k + 14], S22, 0xc33707d6);
			c = GG(c, d, a, b, x[k + 3], S23, 0xf4d50d87);
			b = GG(b, c, d, a, x[k + 8], S24, 0x455a14ed);
			a = GG(a, b, c, d, x[k + 13], S21, 0xa9e3e905);
			d = GG(d, a, b, c, x[k + 2], S22, 0xfcefa3f8);
			c = GG(c, d, a, b, x[k + 7], S23, 0x676f02d9);
			b = GG(b, c, d, a, x[k + 12], S24, 0x8d2a4c8a);
			a = HH(a, b, c, d, x[k + 5], S31, 0xfffa3942);
			d = HH(d, a, b, c, x[k + 8], S32, 0x8771f681);
			c = HH(c, d, a, b, x[k + 11], S33, 0x6d9d6122);
			b = HH(b, c, d, a, x[k + 14], S34, 0xfde5380c);
			a = HH(a, b, c, d, x[k + 1], S31, 0xa4beea44);
			d = HH(d, a, b, c, x[k + 4], S32, 0x4bdecfa9);
			c = HH(c, d, a, b, x[k + 7], S33, 0xf6bb4b60);
			b = HH(b, c, d, a, x[k + 10], S34, 0xbebfbc70);
			a = HH(a, b, c, d, x[k + 13], S31, 0x289b7ec6);
			d = HH(d, a, b, c, x[k + 0], S32, 0xeaa127fa);
			c = HH(c, d, a, b, x[k + 3], S33, 0xd4ef3085);
			b = HH(b, c, d, a, x[k + 6], S34, 0x4881d05);
			a = HH(a, b, c, d, x[k + 9], S31, 0xd9d4d039);
			d = HH(d, a, b, c, x[k + 12], S32, 0xe6db99e5);
			c = HH(c, d, a, b, x[k + 15], S33, 0x1fa27cf8);
			b = HH(b, c, d, a, x[k + 2], S34, 0xc4ac5665);
			a = II(a, b, c, d, x[k + 0], S41, 0xf4292244);
			d = II(d, a, b, c, x[k + 7], S42, 0x432aff97);
			c = II(c, d, a, b, x[k + 14], S43, 0xab9423a7);
			b = II(b, c, d, a, x[k + 5], S44, 0xfc93a039);
			a = II(a, b, c, d, x[k + 12], S41, 0x655b59c3);
			d = II(d, a, b, c, x[k + 3], S42, 0x8f0ccc92);
			c = II(c, d, a, b, x[k + 10], S43, 0xffeff47d);
			b = II(b, c, d, a, x[k + 1], S44, 0x85845dd1);
			a = II(a, b, c, d, x[k + 8], S41, 0x6fa87e4f);
			d = II(d, a, b, c, x[k + 15], S42, 0xfe2ce6e0);
			c = II(c, d, a, b, x[k + 6], S43, 0xa3014314);
			b = II(b, c, d, a, x[k + 13], S44, 0x4e0811a1);
			a = II(a, b, c, d, x[k + 4], S41, 0xf7537e82);
			d = II(d, a, b, c, x[k + 11], S42, 0xbd3af235);
			c = II(c, d, a, b, x[k + 2], S43, 0x2ad7d2bb);
			b = II(b, c, d, a, x[k + 9], S44, 0xeb86d391);
			a = addUnsigned(a, AA);
			b = addUnsigned(b, BB);
			c = addUnsigned(c, CC);
			d = addUnsigned(d, DD);
		}
		var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
		return tempValue.toLowerCase();
	},
	install(app: any) {
		App = app;
		app.config.globalProperties.utils = utils;
	}
};

export default utils;
